﻿using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Web;
using Acaweb.Model.Entities;
using Acaweb.Model.Entities.DatosCompuestos;

namespace Acaweb.Servicios.Contracts
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IEstudiantesService" in both code and config file together.
    [ServiceContract]
    public interface IEstudiantesService
    {
        /// <summary>
        /// Retorna la información de un único estudiante
        /// </summary>
        /// <param name="CodigoEstudiante">Codigo con el que el Estudiante es identificado en la institución</param>
        /// <returns></returns>
        [WebInvoke(Method = "POST", UriTemplate = "GetById", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        Estudiantes GetById(int CodigoEstudiante);


        /// <summary>
        /// Retorna la información de un único estudiante
        /// </summary>
        /// <param name="CodigoEstudiante">Codigo con el que el Estudiante es identificado en la institución</param>
        /// <returns></returns>
        [Acaweb.Servicios.Utility.AmbitoRealizacion(new Acaweb.Servicios.Utility.Ambitos[] { Acaweb.Servicios.Utility.Ambitos.Estudiante, Acaweb.Servicios.Utility.Ambitos.Egresado })]
        [WebInvoke(Method = "POST", UriTemplate = "_GetById", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        Estudiantes _GetById();

        [WebInvoke(Method = "POST", UriTemplate = "GetPeriodos", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        List<PeriodoAcademico> GetPeriodos(int CodigoEstudiante);

        /// <summary>
        /// Retorna el ultimo perido académico en el que el estudiante ha sido matriculado
        /// </summary>
        /// <param name="CodigoEstudiante">Codigo con el que el Estudiante es identificado en la institución</param>
        /// <returns></returns>
        [Acaweb.Servicios.Utility.AmbitoRealizacion(new Acaweb.Servicios.Utility.Ambitos[] { Acaweb.Servicios.Utility.Ambitos.Estudiante, Acaweb.Servicios.Utility.Ambitos.Administrativo })]
        [WebInvoke(Method = "POST", UriTemplate = "_GetLastPeriodoMatriculado", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        PeriodoAcademico _GetLastPeriodoMatriculado();

        /// <summary>
        /// Retorna el ultimo perido académico en el que el estudiante ha sido matriculado
        /// </summary>
        /// <param name="CodigoEstudiante">Codigo con el que el Estudiante es identificado en la institución</param>
        /// <returns></returns>
        [Acaweb.Servicios.Utility.AmbitoRealizacion(new Acaweb.Servicios.Utility.Ambitos[] { Acaweb.Servicios.Utility.Ambitos.Estudiante, Acaweb.Servicios.Utility.Ambitos.Administrativo })]
        [WebInvoke(Method = "POST", UriTemplate = "GetLastPeriodoMatriculado", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        PeriodoAcademico GetLastPeriodoMatriculado(int CodigoEstudiante);

        /// <summary>
        /// Agrega información de un nuevo estudiante al registro
        /// </summary>
        /// <param name="Estudiante"></param>

        [WebInvoke(Method = "POST", UriTemplate = "Create", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        void Create(Estudiantes Estudiante, Encuestas Encuesta);

        /// <summary>
        /// Provee la lista de estudiantes matriculados en un curso
        /// </summary>
        /// <param name="CursoPk"></param>
        /// <returns></returns>
        [Acaweb.Servicios.Utility.AmbitoRealizacion(new Acaweb.Servicios.Utility.Ambitos[] { Acaweb.Servicios.Utility.Ambitos.Estudiante, Acaweb.Servicios.Utility.Ambitos.Docente })]
        [WebInvoke(Method = "POST", UriTemplate = "GetListaEstudianteByCurso", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        List<Estudiantes> GetListaEstudianteByCurso(CursoPk CursoPk);

        /// <summary>
        /// Provee la lista de estudiantes matriculados en un curso
        /// </summary>
        /// <param name="CursoPk"></param>
        /// <returns></returns>
        [WebInvoke(Method = "POST", UriTemplate = "GetByEstado", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        List<Estudiantes> GetByEstado(EstadoEstudiante Estado, int skip, int limit);

        /// <summary>
        /// Agrega información de un nuevo estudiante al registro
        /// </summary>
        /// <param name="Estudiante"></param>
        //Acaweb.Servicios.Utility.AmbitoRealizacion(new Acaweb.Servicios.Utility.Ambitos[] { Acaweb.Servicios.Utility.Ambitos.Administrativo, Acaweb.Servicios.Utility.Ambitos.Estudiante, Acaweb.Servicios.Utility.Ambitos.Egresado })]
        [WebInvoke(Method = "POST", UriTemplate = "Update", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        void Update(Estudiantes Estudiante);

        [Acaweb.Servicios.Utility.AmbitoRealizacion(new Acaweb.Servicios.Utility.Ambitos[] { Acaweb.Servicios.Utility.Ambitos.Estudiante })]
        [WebInvoke(Method = "POST", UriTemplate = "GenerarVolantePago", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        string GenerarVolantePago();

        [WebInvoke(Method = "POST", UriTemplate = "GetByDocumentoIdentidad", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        List<Estudiantes> GetByDocumentoIdentidad(int DocumentoIdentidad);
    }
}